package check

import (
	"cost_api/internal/config"
	"cost_api/utils/iface"
	"regexp"
	"strings"
)

type deptCodeValid struct {
	result  bool
	regexps config.Regexps
	regex   *regexp.Regexp
}

func NewDeptCodeValid() iface.ICodeValid {
	return &deptCodeValid{result: true}
}

func (d *deptCodeValid) DefineRegexp(regexps ...string) iface.ICodeValid {
	//TODO implement me
	d.regexps = regexps
	return d
}

func (d *deptCodeValid) relationRegexp(length int) bool {
	var reg string
	if (length < 0 || length > 10) || d.regexps == nil {
		return false
	}
	handle := func(str *strings.Builder, val string) {
		str.WriteString(val + ".")
	}
	switch length {
	case 8:
		reg = d.regexps.GetSerial(3, handle)
	case 5:
		reg = d.regexps.GetSerial(2, handle)
	case 2:
		reg = d.regexps.GetSerial(1, handle)
	default:
		return false
	}
	d.regex, _ = regexp.Compile(reg)
	return true
}

func (d *deptCodeValid) CheckCode(code string) iface.ICodeValid {
	//TODO implement me
	if !d.result {
		return d
	}
	if d.result = d.relationRegexp(len(code)); !d.result {
		return d
	}
	if !d.regex.MatchString(code) {
		d.result = false
	}
	return d
}

func (d *deptCodeValid) GetParentCode(code string) string {
	parentLen := getParentLen(len(code))
	return code[:parentLen]
}

//func getParentLen(codeLen int) int {
//	// 父代码长度的二进制表示是将原长度向右移动一位
//	len := int(math.Ceil(float64(codeLen-1) / 2))
//	if codeLen > 6 {
//		len += len>>1 + len&1
//	}
//	return len
//}

func getParentLen(codeLen int) int {
	// 父代码长度的二进制表示是将原长度向右移动一位
	if codeLen <= 3 {
		return 0
	}
	return codeLen - 3
}

func (d *deptCodeValid) Check() bool {
	//TODO implement me
	return d.result
}
